﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;

namespace ArxivatDeDocuments.ObjectesDeDades
{
    public class Client
    {
        public String Nif { get; set; }
        public String Nom { get; set; }

        public override string ToString()
        {
            return Nom;
        }


        public string ToPropertiesString()
        { 
            return this.Nif + "=" + PropertiesFileParser.escapeValue(this.Nom.ToUpper());
        }

        public void AddToFile()
        {
            
            TextWriter tw = File.AppendText(Properties.Settings.Default.pathToPropertiesFile);
            
            tw.WriteLine(ToPropertiesString());

            tw.Close();
          
        }


        //--------------------------------------------------------
        //Calcular la letra del NIF           (13/Sep/95)
        //--------------------------------------------------------
        private static String CalculaNIF(String strA ) 
        {
            const string cCADENA = "TRWAGMYFPDXBNJZSQVHLCKE";
            String strT;
            int a, NIF, b, c;
    
            strT = strA.Trim();

            if (strT.Length == 0) return "";

            a = 0;
            NIF = int.Parse(strA);

            do
            {
                b = (NIF / 24);
                c = NIF - (24 * b);
                a = a + c;
                NIF = b;
            } 
            while (b != 0);
                
            b = a / 23;
            c = a - (23 * b);
    
            return strT.Trim() + cCADENA.Substring(c, 1);
        }

        // <summary>
        // Comprueba si es un NIF válido
        // No usar espacios ni separadores para la letra
        // Devuelve True si es correcto
        // </summary>
        // <remarks>
        // Adaptado de un código de SGF
        // http://www.elguille.info/colabora/vb/sgf_Verificar_NIF_CIF.htm
        // </remarks>
        public static bool Verificar_NIF(String valor) 
        {
            string aux;
            Int32 i;
    
            try
            {
                valor =  valor.ToUpper(); //ponemos la letra en mayúscula
                aux = valor.Substring( 0, valor.Length - 1);//quitamos la letra del NIF

                if (aux.Length >= 7 && Int32.TryParse(aux,out i)) 
                    aux = CalculaNIF(aux); // calculamos la letra del NIF para comparar con la que tenemos
                else
                    return false;

                if (valor != aux) 
                    return false;
                else
                    return true;
            }
            catch 
            {
                return false;
            }

        }

        //<summary>
        //Comprueba si es un CIF
        //</summary>
        //<remarks>
        //Adaptado de un código de SGF
        //http://www.elguille.info/colabora/vb/sgf_Verificar_NIF_CIF.htm
        //</remarks>
        public static bool Verificar_CIF(String valor)
        {
            String strLetra, strNumero, strDigit, strDigitAux, letras;
            int auxNum, i, suma=0;

            try
            {
                letras = "ABCDEFGHJKLMNPQRSUVWXY";
                valor = valor.ToUpper();

                if (valor.Length < 9 || !(Int32.TryParse(valor.Substring(1, 7), out auxNum)))
                    return false;


                strLetra = valor.Substring(0, 1) ;    // letra del CIF
                strNumero = valor.Substring(1, 7);    // Codigo de Control
                strDigit = valor.Substring(8);     // CIF menos primera y ultima posiciones

                if (!letras.Contains( strLetra) ) // comprobamos la letra del CIF (1ª posicion)
                    return false;
                

                for (i = 0;i<7;i++)
                {
                    if ((i+1) % 2 == 0)
                        suma = suma + int.Parse(strNumero.Substring(i, 1));
                    else
                    {
                        auxNum = int.Parse(strNumero.Substring(i, 1)) * 2;
                        suma = suma + (int)Math.Truncate((double)(auxNum / 10)) + (auxNum % 10);
                    }
                }

                suma = (10 - (suma % 10)) % 10;

                switch (strLetra)
                {
                    case "K":
                    case "N":
                    case "P":
                    case "Q":
                    case "R":
                    case "S":
                    case "W":
                        suma = suma + 64;
                        strDigitAux = Char.ConvertFromUtf32(suma);
                        break;
                    case "X":
                        strDigitAux = CalculaNIF("0" + strNumero).Substring(8, 1);
                        break;
                    case "Y":
                        strDigitAux = CalculaNIF("1" + strNumero).Substring(8, 1);
                        break;
                    case "Z":
                        strDigitAux = CalculaNIF("2" + strNumero).Substring(8, 1);
                        break;
                    default:
                        strDigitAux = suma.ToString();
                        break;
                }

                if (strDigit == strDigitAux)
                    return true;
                else
                    return false;
            }
            catch 
            { return false; }

        }
    }
}
